*******************************************************************************
●ドキュメント種別      ：各ライブラリ開発説明ファイル
●ファイル記号名称      ：mangfs.txt
●対象ライブラリ記号名称：GFS
●対象ライブラリ名称    ：ファイルシステム
●バージョン            ：2.10
●作成者                ：H.T.
●作成日                ：1995-02-01
●その他のメッセージ    ：なし
*******************************************************************************

１．　Ver.1.01からVer.1.10への変更内容
１．１　ＣＤ先読み処理の変更
（１）　GFS_NwCdReadの使用法変更
　GFS_NwCdReadを呼び出した後、GFS_NwExecOneが完了する前にGFS_NwFreadを呼び出し
てもＣＤからの先読みは有効になります。
　ＣＤからの先読みを使用すると、指定したセクタ数をすべてホスト側に転送するか、
アクセスを中止させるまで完了しなくなりました。（GFS_NwIsCompleteがTRUEを返さな
い。）

（２）　アクセス完了チェック【重要】
　GFS_NwCdReadを呼び出した場合、データ転送が終わるかアクセスが中止されるまで
GFS_NwExecOneは完了を返しません。GFS_NwFreadを呼び出さずにGFS_NwExecOneが完了を
返すのを待ってはいけません。Rel.2のマニュアルP.18の例のようにGFS_NwCdReadの直後
にGFS_NwExecOneの完了を待つと無限ループになるので注意してください。
　GFS_NwCdReadを呼び出していなければ前バージョンと同じ手順でGFS_NwExecOneの完了
をチェックできます。
　ＣＤからの先読みをしているときや、常駐モードのときには、GFS_NwGetStatを使って
転送済みバイトを監視することも同時に行って完了をチェックしてください。以下に例を
示します。
        #define RD_UNIT 10
        GfsHn  gfs;
        Sint32 fid, stat, nbyte;
        Uint32 buf[RD_UNIT*2048/4];

        gfs = GFS_Open(fid);
        GFS_NwCdRead(gfs, 100);
        for (i = 0; i < 100/RD_UNIT; ++i) {
            GFS_NwFread(gfs, RD_UNIT, buf, RD_UNIT*2048);
            while (GFS_NwExecOne(gfs) != GFS_SVR_COMPLETED) {
                GFS_NwGetStat(gfs, &stat, &nbyte);
                /* GFS_NwFreadで指定したバイト数が読み込まれたかを調べる */
                if (nbyte >= RD_UNIT*2048) {
                    break;
                }
                user();                 /* アプリケーション処理 */
            }
        }

１．２　CD-DAファイル処理機能追加
　CD-DA ファイル処理機能を追加しました。CD-DA ファイルの読み込みは、そのファイ
ルで指定される音楽トラックの再生となります。ただし、音を出力させるにはアプリケ
ーション側でSCSPを設定する必要があります。

（１）　ファイルに対する制御制御
　CD-DA ファイルに対してファイルシステムが行う制御は再生と再生範囲の制御だけで
す。再生モードは省略値（リピートなし、ピックアップを移動する）です。

（２）　再生の仕方
　CD-DAファイルを再生するには次の方法があります。
　　(a) GFS_Load
　　(b) GFS_Fread
　　(c) GFS_NwFread
　　(d) GFS_NwCdRead
  (a), (b)の方法では再生が終了するまで戻ってきません。
　(c), (d)の方法ではサーバ関数を呼び出す必要があります。CD-DAの再生が終了すると
サーバ関数はGFS_SVR_COMPLETEDを返します。
　途中から再生するにはGFS_Seekを使用します。
　CD-DAファイルとCD-ROMファイルを同時にアクセスすることはできません。

（３）　ファイル操作に関するパラメータ
　CD-DAファイルに対して、取り出しモード、転送モード、読み込みパラメータ、取り出
しパラメータを変更することはできません。CD-DAファイルに対して次の関数を呼び出す
とエラーを返します。
        GFS_SetGmode
        GFS_SetTmode
        GFS_SetReadPara
        GFS_SetTransPara

１．３　ファイル属性
　GFS_GetFileInfo で出力されるファイル属性の値をCD-ROM XA規格に準拠させるため、
次のように変更しました。
        GFS_ATR_DIR     0x80
        GFS_ATR_CDDA    0x40
        GFS_ATR_INTLV   0x20
        GFS_ATR_FORM2   0x10
        GFS_ATR_FORM1   0x80
        GFS_ATR_END_TBL 0x01
　GFS_ATR_CDDAはCD-DA ファイル処理機能追加のため追加しました。そのビットはCD-DA
ファイルの時1になります。
　その他の定数名とその意味は変わっていません。

１．４　GFS_InitとGFS_LoadDirの関数値
　引数のディレクトリ情報管理構造体へのポインタにNULLを指定すると、ＣＤブロック
ファイルシステムが保持しているディレクトリ情報の個数を関数値として返します。

１．５　エラーコードの追加
（１）　GFS_ERR_BFUL
　常駐モード（GFS_GMODE_RESIDENT）のファイルを読み込み中にＣＤバッファがいっぱ
いになると、このエラーコードが発生します。
　常駐モードのファイルアクセス中にはバッファフルにならないようにアクセスの順序
などを調整してください。

（２）　GFS_ERR_FATAL
　このエラーコードはＣＤドライブが<FATAL>状態になったことを通知します。
　ファイルシステムはこの状態を検出すると、ＣＤ再生を中止（ホーム位置へシーク）
させ、エラー状態からの回復を試みます。このエラーコードを検出したら、処理をリト
ライしてください。

１．６　トレイオープン状態の認識
　ＣＤブロックの割り込み要因レジスタ(HIRQREQ)のDCHGビット(bit5)が1の時も、トレ
イが開いている状態として扱うようにしました。
　開発中は、GFS_Initを呼ぶ前にＣＤステータスがオープンでないことを確認してDCHG
ビットをクリアする処理を行ってください。
　製品版では、BOOT ROMがDCHGフラグをクリアするのでアプリケーションがクリアして
はいけません。

１．７　転送先アドレスによる転送モードの変更
　転送モードがGFS_TMODE_SCUに設定されていても、転送先アドレスが次の空間に含まれ
る場合はCPUによるソフトウェア転送が強制的に行われます。
        WORKRAM-L空間   00200000H 〜 002FFFFFH
        A-Bus空間       02000000H 〜 058FFFFFH

１．８　デバッグファイル関連
（１）　GFMC_base
　SIMMファイルの先頭アドレスを設定する変数GFMC_baseは、sega_gfs.libとsegadgfs.
libの両方に定義しました。
　sega_gfs.lib中のGFMC_baseは、segadgfs.libとの互換性のためだけに存在します。フ
ァイルシステムの動作には影響を与えません。

（２）　ファイル識別子
　ＣＤファイルを使用しないときに"."と".."（カレントディレクトリと親ディレクトリ
）を自動的に追加するという機能を削除しました。これにより、ファイル識別子はブー
ト時と一致します。

２．　Ver.1.10以降の変更内容（Ver.1.11〜Ver.1.20まで）
２．１　Ver.1.10からVer.1.11への変更内容
（１）　GFS_Init関数
　INT_ChgMsk関数により、SCUのレベル0-DMA終了割り込みを許可するようにしました。
（DMA転送の終了判断が割り込みで処理されるように仕様変更されたため。）

２．２　Ver.1.11からVer.1.13へのバグ修正
　(a) 再生中にＣＤバッファがいっぱいになるとリードエラー(GFS_ERR_CDRD)になる障
　　　害を修正しました。

２．３　Ver.1.13からVer.1.15へのバグ修正
　(a) 無用なタイムアウトエラー（GFS_ERR_TMOUT）がでる障害を修正しました。

２．４　Ver.1.15からVer.1.16への変更内容
（１）　GFS_Init関数におけるＣＤブロックの初期設定
　CDC_CdInit関数により、以下の設定をおこないます。
（ECC回数とリトライ回数が最大値に設定され、それ以外はデフォルトのままです。）
　・CDブロックソフトリセット：しない
  ・サブコードデコード      ：しない
  ・モード2サブヘッダ認識   ：する
  ・フォーム2リードリトライ ：しない
  ・CD-ROMデータリード      ：最高速（現在は２倍速）
  ・スタンバイタイム        ：180秒
  ・ECC回数                 ：5回
  ・リトライ回数            ：15回

（２）　リードエラー発生時のリカバリ処理の追加
　GFS_NwExecOne, GFS_NwExecServerにおいてリードエラーが発生した場合、Ver.1.15以
前と同様にGFS_ERR_CDRDを返しますが、そのままサーバ関数を呼ぶとリカバリ処理をし
ます。完了復帰型アクセスでは、Ver.1.15以前と同様にGFS_ERR_CDRDを返します。

（３）　GFS_Freadにおけるタイムアウト時間の延長
　GFS_Fread呼び出し後、データの読み込みが始まるまでのタイムアウト時間を延長しま
した。

（４）　エラーコードの変更
　・GFS_Loadにおけるシーク位置不正                  ：GFS_ERR_OFS
　・GFS_Seekにおけるファイル範囲外へのシーク        ：GFS_ERR_SEEK
　・GFS_NwFread, GFS_Fread再生セクタ数のマイナス指定：GFS_ERR_PARA

（５）　バグ修正
　(a) GFS_TMODE_SCUを使用してB-Busに転送する際、１ワード飛びに転送される障害を
　　　修正しました。
　(b) GFS_TMODE_SDMA0, GFS_TMODE_SDMA1 を使用してロングワード単位でないデータを
　　　転送するとデータが抜け落ちる障害を修正しました。
　(c) GFS_Loadを使用してファイルの末尾まで読まない場合に、読み込み速度が低下す
　　　る障害を改善しました。

２．５　Ver.1.16からVer.1.20へのバグ修正
　(a) GFS_Fread,GFS_LoadでSIMMファイルを読み込んだ場合、読み込みバイト数が2048
　　　バイト単位となる障害を修正しました。
　(b) 以下のどちらかの場合において、データが読み込まれない障害を修正しました。
　　・複数のファイルに対して、同時にGFS_NwCdRead, GFS_Freadを実行し先読みした
　　　場合。
　　・GFS_SetReadParaで指定した最大読み込みセクタ数が、ファイルサイズより小さい
      場合。
　(c) ディレクトリファイルのサイズがセクタ単位でないディスクでも再生できるよう
　　　に修正しました。

３．　Ver.1.20からVer.1.21への変更内容
３．１　関数の追加
┌─────┬────────────────┬──────────┬───┐
│Title     │Function                        │Function Name       │No    │
│関数仕様  │ディレクトリ情報の取得          │GFS_GetDirInfo      │1.6   │
└─────┴────────────────┴──────────┴───┘
［書式］  Sint32  GFS_GetDirInfo(Sint32 fid, GfsDirId *dirrec)
［入力］  fid   ：ファイル識別子
［出力］  dirrec：ディレクトリ情報
［関数値］エラーコード
［機能］
　ファイル識別子からディレクトリ情報を取得する。

┌─────┬────────────────┬──────────┬───┐
│Title     │Function                        │Function Name       │No    │
│関数仕様  │ファイルシステムのリセット      │GFS_Reset           │1.7   │
└─────┴────────────────┴──────────┴───┘
［書式］  void  GFS_Reset(void)
［入力］  なし
［出力］  なし
［関数値］なし
［機能］
　オープンしているファイルを全てクローズし、ファイルシステムをリセットする。
（ディレクトリ情報以外を初期化する）
［備考］
　ストリームシステムを使用している場合、ストリームをクローズしてから本関数を実
  行すること。

┌─────┬────────────────┬──────────┬───┐
│Title     │Function                        │Function Name       │No    │
│関数仕様  │ＣＤバッファ区画のセクタ数の取得│GFS_GetNumCdbuf     │2.9   │
└─────┴────────────────┴──────────┴───┘
［書式］  Sint32 GFS_GetNumCdbuf(GfsHn gfs)
［入力］  gfs   ：ファイルハンドル
［出力］  なし
［関数値］ＣＤバッファ区画内のセクタ数
［機能］
　ＣＤバッファ区画内に存在するセクタ数を取得する。

┌─────┬────────────────┬──────────┬───┐
│Title     │Function                        │Function Name       │No    │
│関数仕様  │転送関数の登録                  │GFS_SetTrFunc       │5.5   │
└─────┴────────────────┴──────────┴───┘
［書式］  void  GFS_SetTrFunc(GfsHn gfs, GfsTrFunc func)
［入力］  gfs   ：ファイルハンドル
          func  ：転送関数
［出力］  なし
［関数値］なし
［機能］
　指定したファイルに対して、転送関数を登録する。
　登録関数は、ファイルの転送処理時に呼び出される。
［備考］
　(a) 登録関数は以下の形式である。
        Sint32 (*GfsTrFunc)(GfsHn gfs, Sint32 nsct)
        gfs  ：ファイルハンドル
        nsct ：転送可能セクタ数
　　　転送関数は、最大nsctセクタのデータを取り出すことができる。
　　　関数値には、実際に取り出したセクタ数を返す。
　　　ただし、DMAなどにより転送関数終了時点で転送中の場合は、(-1)を返すこと。
　(b) 転送関数の例
        Uint32  read_buf[BUFSIZE];
        Sint32  transFunc(GfsHn gfs, Sint32 nsct)
        {
            Uint32  *ptr;
            Sint32  dadr;
            Sint32  i;

            ptr = GFS_StartTrans(gfs, &dadr);
            for (i = 0; i < 2048 * nsct; i++) {
                read_buf[i] = *ptr;
                ptr += dadr;
            }
            return (nsct);
        }

┌─────┬────────────────┬──────────┬───┐
│Title     │Function                        │Function Name       │No    │
│関数仕様  │転送関数における転送開始        │GFS_StartTrans      │5.6   │
└─────┴────────────────┴──────────┴───┘
［書式］  Uint32  *GFS_StartTrans(GfsHn gfs, Sint32 *dadr)
［入力］  gfs   ：ファイルハンドル
          dadr  ：１ロングワード取り出すごとの転送元アドレスの変化分
［出力］  なし
［関数値］転送元アドレス
［機能］
　転送関数においてデータの転送処理を開始する。

３．２　その他の変更
　(a) 必要最小限の関数（下記の注意事項を参照）だけは、SCU-DMA転送中に実行しても
　　　A-Busへアクセスしないように対応しました。
　(b) CDCライブラリVer.1.20に対応しました。

４．　Ver.1.21以降の変更内容（Ver.1.22〜Ver.2.00まで）
４．１　Ver.1.21からVer.1.22への変更内容
　デモデモソフト用の機能を追加しました。この機能を持つGFSライブラリを、特にマル
チGFSライブラリと呼びます。
　マルチGFSを使うことで、製品版かデモデモ版かを意識することなくゲームを開発でき
ます。製品版として作成したプログラムを、そのままデモデモ版として実行できます。

４．１．１　追加関数
┌────────┬───────────────┬────────┬───┐
│Title           │Function                      │Function Name   │No    │
│関数仕様        │トラック番号の変換            │GFS_ConvTno     │6.4   │
└────────┴───────────────┴────────┴───┘
［書式］　Sint32 GFS_ConvTno(Sint32 logtno)
［入力］　logtno :  論理トラック番号（ゲームディスクで扱うトラック番号）
［関数値］物理トラック番号（デモデモディスク上のトラック番号）
［機能］
　論理トラック番号を物理トラック番号に変換する。デモデモ実行中以外の場合は、論
理トラック番号＝物理トラック番号となる。

４．１．２　コーディング時の注意事項
　作成したプログラムをデモデモ版として実行させるには、以下の制限事項に考慮して
コーディングする必要があります。
　(a) プログラム実行中にIPの先頭100HのSYSTEM ID領域を変更してはならない。
　(b) CD-DAの再生は、GFS_ConvTno関数でトラック番号を変換し、ＣＤ通信インタフェ
      ースのトラック番号指定によるCDC_CdPlay関数を使用する。
　　　即値のトラック番号や、CD-DAファイルを使用してはならない。
　(c) ＣＤにアクセスする場合、即値のFADを使用してはならない。
　(d) ディレクトリの深さの上限は、ルートディレクトリを含めて最大７までとする。

４．２　Ver.1.22からVer.2.00への変更点
（１）GFS_Fread関数
　GFS_Fread関数における不要な待ち時間を無くし、処理速度を向上しました。
　（SCU-DMA中のA-Busアクセスも回避されます。）

（２）バグ修正
　(a) ＣＤブロックファイルシステムを使用した場合、サブディレクトリに移動できな
　　　い障害を修正しました。
　(b) CPU-DMAでWORKRAM-Lに転送しようとした場合、ソフトウェア転送される障害を修
　　　正しました。
　(c) 常駐モードでファイルを分割して読み込んだ場合、正しく読めない障害を修正し
　　　ました。

４．３　Ver.2.00からVer.2.01への変更点
（１）バグ修正
　(a) 常駐モードでファイルを読み込んだ後、ファイルの2/3以降にシークしてGFS_Fre
　　　adを行うと、ファイル終了位置以降を読み込む障害を修正しました。
　(b) 常駐モードで最大転送セクタ数を２以上にすると、読み込みが完了しない障害を
　　　修正しました。

４．４　Ver.2.01からVer.2.02への変更点
（１）SGL CD-ROMライブラリとの統一化
　(a) SGL CD-ROMライブラリとソースコードを共有して使用できるようにしました。詳
　　　細は、「５．３　SGL CD-ROMライブラリ作成時の注意」を参照して下さい。

（２）バグ修正
　(a) 200セクタ以上の２つのファイルを、それぞれGFS_NwCdReadした後、GFS_NwFread
　　　により分割して転送しようとすると正常に転送されない障害を修正しました。
　(b) 最終セクタが3byte以下のファイルをCPU-DMAで読み込むとハングする障害を修正
　　　しました。
　(c) ファイル読み込み後、CDC_CdPlayによりCD-DAトラックを再生し、GFS_Closeを行
　　　うと、CD-DAが停止する障害を修正しました。

４．５　Ver.2.02からVer.2.10への変更点
（１）デモデモ用参照領域の変更
　デモデモ実行時の、参照アドレスの先頭を0x60020cc から0x6000cccに変更しました。

（２）致命的エラー検出の強化
　トレイオープン、ＣＤブロックの<FATAL>状態の検出機能を強化しました。

（３）SGL も関する変更
　(a) コンパイルオプションでUSE_SGL を定義した場合も、SCU-DMAが使用できるように
　　　しました。
　(b) SIMM, SCSIファイルを使用する場合、コンパイルオプションで明示的にDEBUG_LIB
　　　を定義しなければならないようにしました。

（４）バグ修正
　(a) ファイル読み込み中に、GFS_NwStop, GFS_Closeを実行した場合、ＣＤバッファに
　　　データが残る障害を修正しました。これにより、ファイル読み込み中にGFS_Close
　　　を実行した場合、ドライブがポーズ状態になるまで内部で待機します。これを、
　　　回避するには、あらかじめGFS_NwStopを実行し、ドライブ停止後、GFS_Closeを実
　　　行してください。
　　　これに伴い、一旦常駐モードで読み込んだファイルを、破棄モードに変更した場
　　　合以前は、初回の読み込み時にＣＤアクセスは行いませんでしたが、初回からＣ
　　　Ｄアクセスするようになりました。
　(b) DMA転送を指定したファイルの読み込み中に、GFS_NwStop, GFS_Close により中断
　　　すると正しく中断処理されない障害を修正しました。

５．　注意事項
５．１　DOSファイル使用時の注意
　DOSファイルの取り出しパラメータは処理の都合上、１度に１セクタしか転送できませ
ん。取り出しパラメータを１以外の値に設定しても無効です。

５．２　SCU-DMA使用時の注意
（１）　割り込み許可
　転送モードがGFS_TMODE_SCUのとき、ファイルシステムライブラリはDMAライブラリを
用いてSCU-DMAを起動します。使用するレベルは０です。
　そのためGFS_Initでは、INT_ChgMsk関数によりSCUのレベル0-DMA終了割り込みを許可
しています。（詳細はDMA／割り込み関連のドキュメントを参照してください。）
    /* SCU-DMA0終了割り込みを許可する */
    INT_ChgMsk(INT_MSK_DMA0, INT_MSK_NULL);

（２）　使用可能な関数の制限
　転送モードがGFS_TMODE_SCUの場合や、転送関数においてSCU-DMAを起動した場合は、
転送が終了するまで以下の関数だけが使用可能です。
　SCU-DMA転送中はA-Busアクセス禁止のため、これ以外の関数は使用を禁止します。
    ・GFS_Reset         ・GFS_Close         ・GFS_NwIsComplete  ・GFS_NwGetStat
    ・GFS_NwExecOne     ・GFS_NwExecServer  ・GFS_GetErrStat

５．３　SGL CD-ROMライブラリ作成時の注意
　コンパイル時にUSE_SGLを定義してコンパイルすると、SGL CD-ROMライブラリ用のモジ
ュールとして使用できます。
　SIMM, SCSIファイルをサポートする場合、SBLを同様にコンパイルオプションでDEBUG_
LIBを定義してください。各ライブラリに必要なオブジェクトファイルは、gfs.lbr なら
びにgfsd1.lbr, gfsd2.lbr を参照してください。

********************************* end of file *********************************
